/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.bo;

import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.indicadores.dao.IndicadorDAO;
import br.uniceub.fsw.indicadores.dao.ObjetivoIndicadorDAO;
import br.uniceub.fsw.indicadores.dao.ValorIndicadorDAO;
import br.uniceub.fsw.indicadores.dao.DadoPrimarioDAO;
import br.uniceub.fsw.indicadores.vo.IndicadorVO;
import br.uniceub.fsw.indicadores.vo.ObjetivoIndicadorVO;
import br.uniceub.fsw.indicadores.vo.ValorIndicadorVO;
import br.uniceub.fsw.indicadores.vo.DadoPrimarioVO;
import java.util.List;
/**
 * Business Object da entidade Objetivo. Essa classe é responsável por todos as
 * funcionalidades de negócio relacionadas à entidade.
 * 
 @author Marcos Mello Nobrega Soares ra 20136178
 */
public class IndicadorBO {

    IndicadorDAO indicadorDAO = new IndicadorDAO();
    
    /**
     * Valida se om registro de indicador está pronto para inserção ou atualização.
     * 
     * @param indicador indicador a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o indicador 
     * informado não possua condições de ser inserido ou atualizado no banco de dados.
     */
    public void validaIndicador(IndicadorVO indicador) throws Exception, NegocioException {
        
        String mensagem = new String();
        
        if(indicador.getNoIndicador() == null || indicador.getNoIndicador().equals("")) {
            mensagem = mensagem.concat("Nome do indicador obrigatório.<br />");
        }
        if(indicador.getDsIndicador() == null || indicador.getDsIndicador().equals("")) {
            mensagem = mensagem.concat("Descrição do indicador obrigatória.<br />");
        }
        if(indicador.getCdPeriodicidade() == null || indicador.getCdPeriodicidade() == 0) {
            mensagem = mensagem.concat("Periodicidade obrigatória.<br />");
        }
        if(indicador.getVlMetaIndicador() == null) {
            mensagem = mensagem.concat("Valor da meta obrigatório.<br />");
        }
        if(indicador.getVlLimiteControleInferior() == null) {
            mensagem = mensagem.concat("Limite inferior obrigatório.<br />");
        }
        if(indicador.getVlLimiteControleSuperior() == null) {
            mensagem = mensagem.concat("Limite superior obrigatório.<br />");
        }
        if(indicador.getDtInicioCalculoIndicador() == null) {
            mensagem = mensagem.concat("Data do início do cálculo obrigatória.<br />");
        }
        if(indicador.getDtInicioCalculoIndicador() != null && indicador.getDtValidade() != null && indicador.getDtValidade().compareTo(indicador.getDtInicioCalculoIndicador()) < 1) {
            mensagem = mensagem.concat("Data de validade deve ser posterior a data de início de cálculo.<br />");
        } 
        if(indicador.getVlMetaIndicador() != null && indicador.getVlLimiteControleInferior() != null && indicador.getVlLimiteControleSuperior() != null) {
            if(indicador.getVlLimiteControleInferior() > indicador.getVlMetaIndicador())
                mensagem = mensagem.concat("Limite inferior deve ser menor ou igual que o valor da meta.<br />");
            if(indicador.getVlLimiteControleSuperior() < indicador.getVlMetaIndicador())
                mensagem = mensagem.concat("Limite superior deve ser maior ou igual que o valor da meta.<br />");
        }
        if(indicador.getCdDimensao() == null || (indicador.getCdDimensao() != null && indicador.getCdDimensao() == 0)) {
            mensagem = mensagem.concat("Dimensão obrigatória.<br />");
        }
        if(indicador.getNoIndicador() != null && !indicador.getNoIndicador().isEmpty()) {
            try {
                validarVOUnico(indicador);
            }
            catch(NegocioException e) {
                mensagem = mensagem.concat(e.getMessage());
            }
            catch(Exception e) {
                throw new Exception(e.getMessage());
            }
        }
        
        if(!mensagem.isEmpty())
            throw new NegocioException(mensagem);
    }
    
    /**
     * Valida se já existe um registro de indicador no Banco de Dados como verificação para inserção.
     * 
     * @param indicador indicador a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o indicador 
     * informado não possua nome para a verificação ou não já exista um Indicador com o mesmo nome no banco de dados.
     */
    public void validarVOUnico(IndicadorVO indicador) throws Exception, NegocioException {
        
        if(indicador.getNoIndicador() == null || indicador.getNoIndicador().isEmpty())
            throw new Exception("Nome do indicador não foi informado");
        
        IndicadorVO indicadorExemplo = new IndicadorVO();
        List<IndicadorVO> lista;
        
        indicadorExemplo.setNoIndicador(indicador.getNoIndicador());
        lista = indicadorDAO.consultarPorExemplo(indicadorExemplo);
        
        if(!lista.isEmpty())
            if(indicador.getIdIndicador() == null || (indicador.getIdIndicador() != null && !lista.get(0).getIdIndicador().equals(indicador.getIdIndicador())))
                throw new NegocioException("Já existe um indicador de nome \"" + indicador.getNoIndicador() +
                    "\" na base de dados");
    }
    
    /**
     * Verifica se o indicador está associado a valor de indicador, objetivo ou dado primário. Se positivo,
     * o indicador não pode ser excluído.
     * 
     * @param indicador indicador a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o indicador 
     * esteja associado a um valor de indicador.
     */
    public void validaExclusão(IndicadorVO indicador) throws Exception, NegocioException {
    
        if(indicador.getIdIndicador() == null)
            throw new Exception("Indicador não foi informado");
        
        ObjetivoIndicadorVO indicadorIndicadorExemplo = new ObjetivoIndicadorVO();
        indicadorIndicadorExemplo.setCdIndicador(indicador.getIdIndicador());
        
        ValorIndicadorVO valorIndicadorExemplo = new ValorIndicadorVO();
        valorIndicadorExemplo.setCdIndicador(indicador.getIdIndicador());
        
        DadoPrimarioVO dadoPrimarioExemplo = new DadoPrimarioVO();
        dadoPrimarioExemplo.setCdIndicador(indicador.getIdIndicador());
        
        List<ObjetivoIndicadorVO> oi = new ObjetivoIndicadorDAO().consultarPorExemplo(indicadorIndicadorExemplo);
        List<ValorIndicadorVO> po = new ValorIndicadorDAO().consultarPorExemplo(valorIndicadorExemplo);
        List<DadoPrimarioVO> dp = new DadoPrimarioDAO().consultarPorExemplo(dadoPrimarioExemplo);
                
        if(oi.size() > 0 || po.size() > 0 || dp.size() > 0) 
             throw new NegocioException("O indicador não pode ser excluído " +
                     "pois está associado a um objetivo, valor de indicador ou dado primário.");        
    }
    
    /**
     * Verifica se o indicador está associado a valor de indicador. Se positivo,
     * a medição já foi iniciada e consequentemente o indicador não pode ser alterado.
     * 
     * @param indicador indicador a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o indicador 
     * esteja associado a valor de indicador.
     */
    public void validaAlteracao(IndicadorVO indicador) throws Exception, NegocioException {
    
        if(indicador.getIdIndicador() == null)
            throw new Exception("Indicador não foi informado");
        
        ValorIndicadorVO valorIndicadorExemplo = new ValorIndicadorVO();
        valorIndicadorExemplo.setCdIndicador(indicador.getIdIndicador());

        List<ValorIndicadorVO> po = new ValorIndicadorDAO().consultarPorExemplo(valorIndicadorExemplo);
                
        if(po.size() > 0) 
             throw new NegocioException("O indicador não pode ser alterado " +
                     "pois está já houve medição para ele.");        
    }
}
